package leetcode;

import org.junit.Before;
import org.junit.Test;
import static org.junit.Assert.assertArrayEquals;

import java.util.HashMap;
import java.util.Map;

/*
    给定一个整数数组 nums 和一个整数目标值 target，请你在该数组中找出 和为目标值 target  的那 两个 整数，并返回它们的数组下标。
    你可以假设每种输入只会对应一个答案，并且你不能使用两次相同的元素。
    你可以按任意顺序返回答案。

    示例 1：
    输入：nums = [2,7,11,15], target = 9
    输出：[0,1]
    解释：因为 nums[0] + nums[1] == 9 ，返回 [0, 1] 。

    示例 2：
    输入：nums = [3,2,4], target = 6
    输出：[1,2]

    示例 3：
    输入：nums = [3,3], target = 6
    输出：[0,1]

    提示：
    2 <= nums.length <= 104
    -109 <= nums[i] <= 109
    -109 <= target <= 109
    只会存在一个有效答案
 */
public class ToNumSumEquTarget {
    private int[] nums;
    private int target;

    @Before
    public void dataInit() {
        nums = new int[]{11,7,15,2};
        target = 9;
    }

    @Test // 复杂度 O(n)
    public void method_2() {
        Map<Integer, Integer> map = new HashMap<>();
        for (int i = 0; i < nums.length; i++) {
            int nums_2 = target - nums[i];
            if (map.containsKey(nums_2)){
                System.out.println("[" + map.get(nums_2) + ", " + i + "]");
                return;
            }
            map.put(nums[i], i);
        }
        System.out.println("未匹配到数据");
    }

    @Test // 暴力求解 复杂度 O(n^2)
    public void method_1() {
        System.out.println("暴力求解");
        for (int i = 0; i < nums.length; i++) {
            int nums_2 = target - nums[i];
            for (int j = i + 1; j < nums.length; j++) {
                if (nums[j] == nums_2){
                    System.out.println("[" + i + ", " + j + "]");
                }
            }
        }
    }
}
